home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #002 (19xx)(Amiga User Group Deutschland e.V.).zip
/
Franz PD Disk #002 (19xx)(Amiga User Group Deutschland e.V.).adf
/
HP-10C
/
display.mod
< prev
next >
Wrap
Text File
|
1988-02-24
|
5KB
|
166 lines
IMPLEMENTATION MODULE CalcDisplay;
(*
Created: Duncan Prindle, September 1, 1986
Modified: Perhaps
*)
FROM CalcFunctions IMPORT ErrorType, X, SAME, NDeci;
FROM Conversions IMPORT ConvertToString;
FROM Intuition IMPORT IntuitionTextPtr, IntuitionText, PrintIText,
WindowPtr;
FROM MathLib0 IMPORT log, power;
FROM M2Conversions IMPORT ConvertReal;
FROM SYSTEM IMPORT ADDRESS, ADR, BYTE, NULL, WORD;
VAR
Display : ARRAY[0..18] OF CHAR;
DISPLAY : IntuitionText;
Cexp : LONGCARD; Emask : LONGBITSET; Eshift : LONGCARD;
LDisp : LONGCARD; Mmask : LONGBITSET; Mshift : LONGCARD;
HiddenBit : LONGCARD;
Shifts : ARRAY[0..23] OF LONGCARD;
PROCEDURE DisplayX( error : ErrorType;
wp : WindowPtr ) ;
VAR NDecimal : INTEGER;
BEGIN
(* Delete Old Display *)
WITH DISPLAY DO
FrontPen := BYTE (0); BackPen := BYTE (0);
DrawMode := BYTE (0);
LeftEdge := 5; TopEdge := 3;
ITextFont := NULL; NextText := NULL;
IText := ADR( Display );
END;
PrintIText( wp^.RPort^, DISPLAY, 8, 15 );
(* Print out any error messages *)
CASE error OF
DivideByZero : Display := "Divide by 0 ?"; |
NegSqrt : Display := "SQRT: X < 0 ?"; |
NegLog : Display := "Log: X < 0 ?"; |
NegLn : Display := "Ln: X < 0 ?"; |
AsinTooBig : Display := "ASIN: X > 1 ?"; |
XTooBigForSIN : Display := "X Too Big 4 sin"; |
AcosTooBig : Display := "ACOS: X > 1 ?"; |
XTooBigForCOS : Display := "X Too Big 4 cos"; |
XTooBigForTAN : Display := "X Too Big 4 tan"; |
piOver2 : Display := "X Close to pi/2"; |
OverFlow : Display := "Result Too Big"; |
NoError :
(* No Error. Create character string containing desired format *)
CASE display OF
BINARY : IntDisp( 2 ); |
OCTAL : IntDisp( 8 ); |
HEX : IntDisp( 16 ); |
DECIMAL : IF SAME
THEN IF (X = 1.0) & (NDeci = 0)
THEN Display := " 1.";
ELSIF (X = -1.0) & (NDeci = 0)
THEN Display := " -1.";
ELSE ConvertReal( X, 15, NDeci, Display );
END;
ELSE ConvertReal( X, 15, NDecDigits, Display );
END; |
SCIENTIFIC: ConvertReal( X, 15, NSciDigits, Display );
Display[11] := ' '
END;
|
ELSE Display := " ? ERROR ?";
END;
(* Now display new number *)
WITH DISPLAY DO
FrontPen := BYTE (2); BackPen := BYTE (0);
DrawMode := BYTE (0);
LeftEdge := 5; TopEdge := 3;
ITextFont := NULL; NextText := NULL;
IText := ADR( Display );
END;
PrintIText( wp^.RPort^, DISPLAY, 8, 15 );
END DisplayX;
PROCEDURE IntDisp( Base : CARDINAL );
VAR neg : BOOLEAN;
done : BOOLEAN;
I : INTEGER;
ILast : INTEGER;
DispL : ARRAY[0..33] OF CHAR;
PROCEDURE Shift( VAR items : ARRAY OF WORD ) : LONGCARD;
BEGIN
RETURN Shifts[ INTEGER( items[1] ) ];
END Shift;
BEGIN
neg := X < 0.0;
(* We turn a REAL into a LONGCARD.
This procedure will give us up to 24 bits *)
Cexp := LONGCARD( LONGBITSET( X ) * Emask ) DIV Eshift;;
IF Cexp < 126
THEN LDisp := 0;
ELSIF Cexp > 150
THEN Display := "24 BIT OverFlow";
RETURN;
ELSE Cexp := 150 - Cexp;
Mshift := Shift( Cexp );
LDisp := ( LONGCARD( LONGBITSET( X ) * Mmask ) + HiddenBit )
DIV Mshift;
END;
ConvertToString( LDisp, Base, neg, DispL, done);
IF ~done
THEN Display := "Display Error";
ELSE
(* Copy from DispL to Display, justifying to right of Display *)
I := 0; ILast := 0;
WHILE (DispL[I] # ' ') & ( I < 15 ) DO
INC(I);
ILast := I;
END;
FOR I := 0 TO ILast DO
Display[I+15-ILast] := DispL[I];
END;
END;
END IntDisp;
BEGIN
display := DECIMAL;
NDecDigits := 3;
NSciDigits := 3;
Emask := LONGBITSET{23..30};
Eshift := 8388608;
HiddenBit := 8388608;
Mmask := LONGBITSET{1..22};
Shifts[ 0] := 1; Shifts[ 1] := 2; Shifts[ 2] := 4;
Shifts[ 3] := 8; Shifts[ 4] := 16; Shifts[ 5] := 32;
Shifts[ 6] := 64; Shifts[ 7] := 128; Shifts[ 8] := 256;
Shifts[ 9] := 512; Shifts[10] := 1024; Shifts[11] := 2048;
Shifts[12] := 4096; Shifts[13] := 8192; Shifts[14] := 16384;
Shifts[15] := 32764; Shifts[16] := 65528; Shifts[17] := 131072;
Shifts[18] := 262144; Shifts[19] := 524288; Shifts[20] := 1048576;
Shifts[21] := 2097152; Shifts[22] := 4194304; Shifts[23] := 8388608;
END CalcDisplay.